﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Routing;
using PInitiatives.ViewModels.VMInitiative;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Web.Mvc;
using System.Web.Security;
using DataAnnotationsExtensions;

namespace PInitiatives.Models
{


    public class CreateInitiativeModel
    {
        [Required(ErrorMessage = "Podaj nazwę Iventu")]
        [Display(Name = "Nazwa Iventu")]
        [StringLength(50, ErrorMessage = "Nazwa Iventu nie może być dłuższa niż 50 znaków")]
        public string Name { get; set; }

        [Required(ErrorMessage = "Podaj opis Iventu")]
        [Display(Name = "Opis Iventu")]
        [StringLength(250, ErrorMessage = "Opis Iventu nie może być dłuższy niż 250 znaków")]
        public string Description { get; set; }

        [Required(ErrorMessage = "Podaj limit uczestników")]
        [Range((int)2, 30, ErrorMessage = "Możesz utworzyć Inicjatywę dla osób w liczbie 2-30")]
        [Integer(ErrorMessage = "Możesz utworzyć Inicjatywę dla osób w liczbie 2-30")]
        [Display(Name = "Limit uczestników")]
        public int Limit { get; set; }

        //[Required]
        //[Display(Name = "Status")]
        //public string State { get; set; }

        [Required]
        [Display(Name = "Data rozpoczęcia Iventu")]
        [RegularExpression("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}", ErrorMessage = "Wybierz datę korzystając z kalendarza.")]
        public String StartDate { get; set; }

        [Required]
        [Display(Name = "Data rezygnowania z Iventu")]
        [RegularExpression("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}", ErrorMessage = "Wybierz datę korzystając z kalendarza.")]
        public String FreeResignDate { get; set; }

        [Required]
        [Display(Name = "Kategoria")]
        public int Category { get; set; }

    }


    public class EditInitiativeModel
    {
        [Required(ErrorMessage = "Podaj nazwę Iventu")]
        [Display(Name = "Nazwa Iventu")]
        public string Name { get; set; }

        [Required(ErrorMessage = "Podaj opis Iventu")]
        [Display(Name = "Opis Iventu")]
        public string Description { get; set; }

        [Required(ErrorMessage = "Podaj limit uczestników")]
        [Range((int)2, 30, ErrorMessage = "Możesz utworzyć Inicjatywę dla osób w liczbie 2-30")]
        [Integer(ErrorMessage = "Możesz utworzyć Inicjatywę dla osób w liczbie 2-30")]
        [Display(Name = "Limit uczestników")]
        public int Limit { get; set; }

        [Required]
        [Display(Name = "Status")]
        public string State { get; set; }

        [Required]
        [Display(Name = "Data rozpoczęcia Iventu")]
        [RegularExpression("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}", ErrorMessage = "Wybierz datę korzystając z kalendarza.")]
        public String StartDate { get; set; }

        [Required]
        [Display(Name = "Data rezygnowania z Iventu")]
        [RegularExpression("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}", ErrorMessage = "Wybierz datę korzystając z kalendarza.")]
        public String FreeResignDate { get; set; }

        [Required]
        [Display(Name = "Kategoria")]
        public int Category { get; set; }

    }



    public partial class Initiative
    {

        public string statusPL
        {
            get
            {
                if (this.State.Equals("Active"))
                    return "Aktywna";
                else if (this.State.Equals("Finished"))
                    return "Zakończona";
                else if (this.State.Equals("Canceled"))
                    return "Anulowana";
                else
                    return this.State;
            }
        }

        
        
        //static string getStatusEn()
        //{
        //    if (this.State.Equals("Active"))
        //        return "Aktywna";
        //    else if (this.State.Equals("Finished"))
        //        return "Zakończona";
        //    else if (this.State.Equals("Canceled"))
        //        return "Anulowana";
        //    else
        //        return this.State;
        //}

        private PInitiativesEntities _db = new PInitiativesEntities();

        public IQueryable<User> getInitiativeUsers()
        {

            IQueryable<User> uu = _db.InitiativeUsers.Where(iu => iu.InitiativeID == this.ID)
                .Join(_db.Users, iu => iu.UserID, u => u.ID, (iu, u) => u);
            return uu;
        }

        public IQueryable<User> getInitiativeUsers(string initiativeUserStatus)
        {

            IQueryable<User> uu = _db.InitiativeUsers.Where(iu => (iu.InitiativeID == this.ID && iu.State.Equals(initiativeUserStatus)))
                .Join(_db.Users, iu => iu.UserID, u => u.ID, (iu, u) => u);
            return uu;
        }

        public IQueryable<User> getInitiativeUsers(string[] initiativeUserStatus)
        {
            IQueryable<User> uu = null;
            foreach (string s in initiativeUserStatus)
            {
                if (uu == null)
                {
                    uu = _db.InitiativeUsers.Where(iu => (iu.InitiativeID == this.ID && iu.State.Equals(s)))
                        .Join(_db.Users, iu => iu.UserID, u => u.ID, (iu, u) => u);
                }
                else
                {
                    uu.Concat(_db.InitiativeUsers.Where(iu => (iu.InitiativeID == this.ID && iu.State.Equals(s)))
                        .Join(_db.Users, iu => iu.UserID, u => u.ID, (iu, u) => u));
                }
            }
            return uu;
        }

        public void addInitiativeUsers(User u)
        {
            InitiativeUser iu = new InitiativeUser();
            iu.InitiativeID = this.ID;
            iu.UserID = u.ID;
            iu.State = "Participated";
            _db.InitiativeUsers.Add(iu);
            _db.SaveChanges();
        }


        public void addInitiativeUsers(User u, string status)
        {
            InitiativeUser iu = new InitiativeUser();
            iu.InitiativeID = this.ID;
            iu.UserID = u.ID;
            iu.State = status;
            _db.InitiativeUsers.Add(iu);
            _db.SaveChanges();
        }

        public void removeInitiativeUsers(User u)
        {
            InitiativeUser ii = _db.InitiativeUsers.Single(iu => (iu.InitiativeID == this.ID && iu.UserID == u.ID));
            _db.InitiativeUsers.Remove(ii);
            _db.SaveChanges();
        }

        public void setInitiativeUsersStatus(User u, string s)
        {
            InitiativeUser ii = _db.InitiativeUsers.Single(iu => (iu.InitiativeID == this.ID && iu.UserID == u.ID));
            ii.State = s;
            _db.SaveChanges();
        }

        public bool HasFreeSpace
        {
            get { return FreeSpaceCheck(); }
        }

        private bool FreeSpaceCheck()
        {
            if (this.Limit <= getInitiativeUsers("Participated").Count())
                return false;
            else
                return true;
        }

        public int usersCount
        {
            get
            {
                return getUsersCount();
            }
        }

        public int getUsersCount(){
            return Limit-getInitiativeUsers("Participated").Count();
        }

        /*
         *  funkcja przypisuje request nowe wartosci, aby bylo wiadomo, ktory link zostal klikniety
         *  stare sa przepisywane
         */
        public static RouteValueDictionary RequestToDictionary(VMInitiativeBrowse bvm, string key, object value)
        {
            RouteValueDictionary newRvd = new RouteValueDictionary();

            newRvd["category"] = bvm.category;
            //newRvd["page"] = bvm.page;
            //newRvd["orderBy"] = bvm.orderBy;
            //newRvd["orderRule"] = bvm.orderRule;
            newRvd["searchString"] = bvm.searchString;

            newRvd[key] = value;

            #region old approach /tabela wlasna/            
            //if (key.Equals("orderBy"))
            //{
            //    newRvd["orderBy"] = value;
            //    if (bvm.orderBy.Equals(value))
            //    {
            //        if ((int)bvm.orderRule == 0)
            //            newRvd["orderRule"] = 1;
            //        else
            //            newRvd["orderRule"] = 0;
            //    }
            //}
            //else if (key.Equals("page") && (int)value < 1)
            //{
            //    newRvd["page"] = 1;
            //}
            //else
            //{
            //    newRvd[key] = value;
            //}
            #endregion old approach /tabela wlasna/

            return newRvd;
        }
    }
    
}